import { ref, onMounted } from 'vue';
import { UserAPI } from '@/api/user';
import { useUserStore } from '@/store/user';
import { useLoginModalStore } from '@/store/loginModal';
import { useRouter } from 'vue-router';
import { ElMessage } from 'element-plus';

// Google OAuth 客户端 ID
const CLIENT_ID = '587304422040-pe0abbpn1l4h4jljf00kpgptk2oamd2k.apps.googleusercontent.com';
let tokenClient: any = null;

// 声明全局 Google 类型
declare global {
  interface Window {
    google?: {
      accounts: {
        id: {
          initialize: (config: any) => void;
          prompt: (callback?: (notification: any) => void) => void;
          renderButton: (element: HTMLElement, config: any) => void;
          disableAutoSelect: () => void;
        };
        oauth2: {
          initTokenClient: (config: any) => {
            requestAccessToken: () => void;
          };
        };
      };
    };
  }
}

export interface GoogleLoginOptions {
  /**
   * 登录成功后的回调函数
   */
  onSuccess?: (userInfo: any) => void;
  /**
   * 登录失败后的回调函数
   */
  onError?: (error: any) => void;
  /**
   * 是否自动关闭登录弹窗（如果是从弹窗中调用）
   */
  autoCloseModal?: boolean;
  /**
   * 登录成功后是否跳转
   */
  redirectTo?: string;
}

/**
 * 全局谷歌登录 Composable
 * 可以在登录页面和登录弹窗中使用
 */
export function useGoogleLogin() {
  const isGoogleLoading = ref(false);
  const isGoogleLoaded = ref(false);
  const router = useRouter();

  // 等待 Google SDK 加载完成的函数
  function waitForGoogleSDK(maxAttempts = 50, interval = 100): Promise<void> {
    return new Promise((resolve, reject) => {
      let attempts = 0;

      const checkSDK = () => {
        if (window.google?.accounts?.oauth2) {
          isGoogleLoaded.value = true;
          resolve();
          return;
        }
        attempts++;
        if (attempts >= maxAttempts) {
          console.error('Google SDK 加载超时，请检查网络连接或 Google 服务是否可用');
          reject(new Error('Google SDK 加载超时'));
          return;
        }
        setTimeout(checkSDK, interval);
      };
      checkSDK();
    });
  }

  // 初始化 Google OAuth 客户端
  async function initGoogleClient() {
    try {
      // 确保 SDK 已加载
      await waitForGoogleSDK();

      if (!window.google?.accounts?.oauth2) {
        console.error('Google OAuth2 API 不可用');
        return;
      }

      tokenClient = window.google.accounts.oauth2.initTokenClient({
        client_id: CLIENT_ID,
        scope: 'openid profile email',
        callback: handleCredentialResponse,
        error_callback: handleError,
      });

      console.log('Google OAuth 客户端初始化成功');
    } catch (error) {
      console.error('初始化 Google OAuth 客户端失败:', error);
    }
  }

  // 错误回调处理
  function handleError(error: any) {
    console.error('Google OAuth 错误:', error);
    isGoogleLoading.value = false;
    ElMessage.error('Google Login Failed');
  }

  // 触发登录的回调
  async function handleCredentialResponse(response: any) {
    console.log('Google 返回:', response);

    if (!response || !response.access_token) {
      console.error('Google 返回数据无效:', response);
      handleError({ type: 'invalid_response', response });
      isGoogleLoading.value = false;
      return;
    }

    try {
      // 调用后端 API 进行登录验证
      const loginResult = await UserAPI.googleLogin({
        token: response.access_token,
        source_type: 1,
      });

      // 存储用户信息
      const userStore = useUserStore();
      userStore.loginSuccess(loginResult);

      ElMessage.success('Google Login Success');

      // 关闭登录弹窗并处理登录成功逻辑（如果是从弹窗中调用）
      const loginModalStore = useLoginModalStore();
      if (loginModalStore.visible) {
        await loginModalStore.handleLoginSuccess();
      } else {
        // 如果需要跳转，可以通过路由跳转
        if (router) {
          setTimeout(() => {
            router.push('/');
          }, 500);
        }
      }
    } catch (error: any) {
      console.error('Google 登录失败:', error);
      ElMessage.error('Google Login Failed');
    } finally {
      isGoogleLoading.value = false;
    }
  }

  // 组件挂载时初始化
  onMounted(() => {
    // 如果 SDK 已经加载完成，直接初始化
    if (window.google?.accounts?.oauth2) {
      initGoogleClient();
    } else {
      // 否则等待 SDK 加载完成
      // 监听 window.load 事件（但不覆盖）
      if (document.readyState === 'complete') {
        initGoogleClient();
      } else {
        window.addEventListener(
          'load',
          () => {
            initGoogleClient();
          },
          { once: true }
        );
      }
    }
  });

  const loginWithGoogle = async () => {
    // 如果 tokenClient 还没有初始化，先尝试初始化
    if (!tokenClient) {
      console.log('TokenClient 未初始化，尝试初始化...');
      await initGoogleClient();
    }

    if (!tokenClient) {
      console.error('无法初始化 Google OAuth 客户端');
      ElMessage.error(
        'The Google login service is temporarily unavailable. Please try again later'
      );
      return;
    }

    try {
      isGoogleLoading.value = true;
      console.log('发起 Google 登录请求...');
      tokenClient.requestAccessToken();
    } catch (error) {
      console.error('发起 Google 登录失败:', error);
      isGoogleLoading.value = false;
      ElMessage.error('Google Login Failed');
    }
  };

  return {
    isGoogleLoading,
    isGoogleLoaded,
    loginWithGoogle,
  };
}
